package Exerise;

public class Test1 {
    /*给定一个整数数组 nums 和一个整数目标值 target，请你在该数组中找出 和为目标值 target  的那 两个 整数，并返回它们的数组下标。

    你可以假设每种输入只会对应一个答案，并且你不能使用两次相同的元素。

    你可以按任意顺序返回答案*/
    public int[] twoSum(int[] nums, int target) {
        int len =nums.length;
        for (int i = 0; i < len; i++) {
           for (int j=i+1;j<len;j++){
               if(nums[i]+nums[j]==target){
                   return  new int[] {i,j};
               }
           }
        }
        return new int[0];
    }
    //移除元素
    public int removeElement(int[] nums, int val) {
        int cur =nums.length;
        for(int i=0;i<cur;){
            if(cur==val){
                nums[i] =nums[cur-1];
                cur--;
            }else {
                i++;
            }
        }
        return cur;
    }
    //方法1
    public int removeElement1(int[] nums, int val) {
        int key =0;
        for(int num:nums){
            if(val !=key){
               nums[key] = num;
                key++;
            }
        }
        return key;
    }
    //给定一个排序数组和一个目标值，在数组中找到目标值，并返回其索引。如果目标值不存在于数组中，返回它将会被按顺序插入的位置。
    //请必须使用时间复杂度为 O(log n) 的算法
    //使用了二分查找
    public int searchInsert(int[] nums, int target) {
        int left =0;
        int right =nums.length;
        while(left<=right){
            int mid = (left+right)/2;
            if(mid==target){
                return mid;
            }else if(mid<target){
                return mid+1;
            }else{
                return mid-1;
            }
        }
        return left;
    }

    public static void main1(String[] args) {
        int [] arr={1,2,3,4,5};
        System.out.println(arr.length);
        System.out.println(arr[1]);
    }
    /*给定一个由 整数 组成的 非空 数组所表示的非负整数，在该数的基础上加一。

最高位数字存放在数组的首位， 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外，这个整数不会以零开头。*/
    public int[] plusOne(int[] digits) {
        int len =digits.length;
        for (int i = len-1; i >=0 ; i--) {
            digits[i] =(digits[i]+1) %10;
            if(digits[i] !=0){
                return  digits;
            }
        }
        digits =new int [len+1];
        digits[0] =1;
        return  digits;
    }
    /*合并两个数组
     */
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int len1 =m-1;
        int len2 = n-1;
        int len = m+n-1;
        while(n>=0 &&m >=0){
            if(nums1[len1]>=nums2[len2]){
                nums1[len] =nums1[len1];
                len1--;
            }else{
                nums1[len]=nums2[len2];
                len2--;
            }
            len--;
        }
        while(len2>=0){
            nums1[len]=nums2[len2];
            len2--;
            len--;
        }
    }
}
